package com.cart.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class TokenUtil {
    @Value("${jjwt.expiration}")
    private long expiration;    //token有效时间
    @Value("${jjwt.secret}")
    private String secret;      //生成token时使用的密钥

    private static final String CLAIM_KEY_USERNAME = "sub";    //在jwt的CLAIM部分中以sub为key存储[用户名]
    private static final String CLAIM_KEY_CREATED = "created"; //在jwt的CLAIM部分中以created为key存储[创建时间]

    /**
     * 生成token字符串
     * @param userId 用户id
     * @return token字符串
     */
    public String generateToken(int userId){
        Map<String,Object> claims = new HashMap<String, Object>();
        claims.put(CLAIM_KEY_CREATED,new Date());    //创建时间
        claims.put(CLAIM_KEY_USERNAME,userId);    //openId
        return generateToken(claims);
    }

    /**
     * 从token字符串中获取userId
     * @param token token字符串
     * @return 用户id
     */
    public int getUserId(String token){
        String subject = getClaimsFromToken(token).getSubject();
        return Integer.parseInt(subject);
    }


    private Claims getClaimsFromToken(String token){
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }

    private String generateToken(Map<String,Object> claims){
        return Jwts.builder()
                .setClaims(claims)   //设置Claim部分内容
                .setExpiration(generateExpirationDate())    //设置token的过期时间
                .signWith(SignatureAlgorithm.HS512,secret)  //设置前面方式，包括加密方式及密钥
                .compact();    //生成token字符串
    }

    private Date generateExpirationDate(){
        return new Date(System.currentTimeMillis()+expiration*1000);
    }


}
